# 静态方法
# 使用@staticmethod来进行修饰，静态方法没有self cls 参数的限制
# 静态方法与类无关，可以被转换成函数使用
class Person(object):
    @staticmethod
    def study():
        print('hello')

# 既可以用对象访问，也可以用类访问
Person.study()
pe = Person()
pe.study()

# 类方法
# 使用装饰器@classmethod类标识为类方法，对于类方法，第一个参数必须是类对象，一般是以cls作为第一个参数
# 当方法中需要使用到类对象(如访问私有类属性等)，定义类方法
class Student(object):
    @classmethod
    def study(cls): # cls 类对象本身
        print(cls)
Student.study()

# 总结
# 实例方法：方法内部访问实例属性，方法内部可以通过类名.类属性名来访问类属性
# 静态方法：方法内部，不需要访问实例属性和类属性
# 如果要访问实例属性，可以通过类名.类属性名，不能访问实例属性
# 类方法：方法内部只需要访问类属性
# 类属性是公共的，所有方法内部都能访问到，静态方法不需要访问类属性，因为静态方法和类、对象没有关联
# 实例属性是私有的，只有实例方法内部能够访问到

class Person(object):
    name = 'xiaoming' # 类属性

    def __init__(self):
        self.age = 18 # 实例属性 对象私有

    def play(self): # 实例方法
        print(f"{Person.name} play game")
        print(f"age: {self.age}")

    @staticmethod
    def study():
        print(f"{Person.name} study") # 没有意义 常用于工具类

    @classmethod
    def introduce(cls):
        print(f"{cls.name} introduce")

pe = Person()
pe.play()
pe.introduce()
pe.study()

Person.study()